﻿#define _CRT_SECURE_NO_WARNINGS

//class A
//{
//protected:
//    int _a1;
//    int _a2;
//};
//class B : public A
//{
//public:
//    B()
//        : _a1(0)
//        , _a2(0)
//        , _b1(0)
//        , _b2(0)
//    {
//    }
//protected:
//    int _b1;
//    int _b2;
//};

//class C
//{
//public:
//    C(int c)// 显式写的这个函数不是默认构造函数, 而且由于你显式写了这个构造函数, 编译器也不会生成默认构造函数
//    {
//        _c = c;
//    }
//protected:
//    int _c;
//};
//class D : public C
//{
//public:
//    D()
//        : C(0)// 这时你需要这样显式调用, 否则你不显式调用, 编译器又找不到 C 的默认构造, 就会报错
//        , _d(0)
//    {}
//    //D()
//    //    :_d(0)
//    //{
//    //    C(0);// 函数体内显式调用是不被允许的, 写上这一行会报错
//    //}
//protected:
//    int _d;
//};

//class E
//{
//public:
//    E(const E& e)
//    {
//        _e = e._e;
//    }
//protected:
//    int _e;
//};
//class F : public E
//{
//public:
//    F(const F& f)
//        : E(f)
//        , _f(f._f)
//    {
//
//    }
//protected:
//    int _f;
//};

//class G
//{
//public:
//protected:
//    int _g;
//};
//class H : public G
//{
//public:
//    H& operator=(const H& h)
//    {
//        if (this != &h)
//        {
//            G::operator=(h);
//            _h = h._h;
//        }
//        return *this;
//    }
//protected:
//    int _h;
//};

//class I
//{
//public:
//    ~I() {}
//};
//class J :/* public*/ I
//{
//public:
//    ~J()
//    {
//        I::~I();
//    }
//    int _j;
//};

//class A final
//{
//
//};
//
//class B : A
//{
//
//};


//class A
//{
//    friend void fun();
//protected:
//    int _a;
//};
//class B : public A
//{
//protected:
//    int _b;
//};
//void fun()
//{
//    A a;
//    a._a = 0;
//    B b;
//    b._a = 0;
//    //b._b = 0;
//}
//int main()
//{
//    //D d;
//    //J j;
//    //j._j;
//
//    return 0;
//}

//#include <iostream>
//using namespace std;
//
//class A
//{
//public:
//	int _a;
//	static int _static;
//};
//
//int A::_static = 0;
//
//class B : public A
//{
//public:
//	int _b;
//};
//
//int main()
//{
//	A a;
//	B b;
//	// 这⾥的运行结果可以看到非静态成员 _name 的地址是不⼀样的
//	// 说明派生类继承下来了，基类派生类对象各有⼀份
//	cout << &a._a << endl;
//	cout << &b._a << endl;
//	// 这⾥的运行结果可以看到静态成员 _count 的地址是⼀样的
//	// 说明派生类和基类共⽤同⼀份静态成员
//
//	cout << &a._static << endl;
//	cout << &b._static << endl;
//	// 公有的情况下，基类派生类指定类域都可以访问静态成员
//	cout << A::_static << endl;
//	cout << B::_static << endl;
//	return 0;
//}

//class A
//{
//
//};
//class B
//{
//
//};
//class C : public A, public B
//{
//
//};
//class Base1
//{
//public:
//	int _b1;
//};
//class Base2
//{
//public:
//	int _b2;
//};
//class Derive : public Base1, public Base2
//{
//public:
//	int _d;
//};
//int main()
//{
//	Derive d;
//	Base1* p1 = &d;
//	Base2* p2 = &d;
//	Derive* p3 = &d;
//
//	return 0;
//}

class A
{
public:
    int _id;
};
class B : public A {};
class C : public A {};
class D : public B, public C {};

int main()
{
    D d;
    d.B::_id;
    d.C::_id;
    return 0;
}